home *** CD-ROM | disk | FTP | other *** search
- package java.util;
-
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.Serializable;
- import java.lang.reflect.Array;
-
- public class ArrayDeque<E> extends AbstractCollection<E> implements Deque<E>, Cloneable, Serializable {
- private transient E[] elements;
- private transient int head;
- private transient int tail;
- private static final int MIN_INITIAL_CAPACITY = 8;
- private static final long serialVersionUID = 2340985798034038923L;
-
- private void allocateElements(int var1) {
- int var7 = 8;
- if (var1 >= var7) {
- int var3 = var1 | var1 >>> 1;
- int var4 = var3 | var3 >>> 2;
- int var5 = var4 | var4 >>> 4;
- int var6 = var5 | var5 >>> 8;
- var7 = var6 | var6 >>> 16;
- ++var7;
- if (var7 < 0) {
- var7 >>>= 1;
- }
- }
-
- this.elements = (E[])(new Object[var7]);
- }
-
- private void doubleCapacity() {
- assert this.head == this.tail;
-
- int var1 = this.head;
- int var2 = this.elements.length;
- int var3 = var2 - var1;
- int var4 = var2 << 1;
- if (var4 < 0) {
- throw new IllegalStateException("Sorry, deque too big");
- } else {
- Object[] var5 = new Object[var4];
- System.arraycopy(this.elements, var1, var5, 0, var3);
- System.arraycopy(this.elements, 0, var5, var3, var1);
- this.elements = (E[])(var5);
- this.head = 0;
- this.tail = var2;
- }
- }
-
- private <T> T[] copyElements(T[] var1) {
- if (this.head < this.tail) {
- System.arraycopy(this.elements, this.head, var1, 0, this.size());
- } else if (this.head > this.tail) {
- int var2 = this.elements.length - this.head;
- System.arraycopy(this.elements, this.head, var1, 0, var2);
- System.arraycopy(this.elements, 0, var1, var2, this.tail);
- }
-
- return (T[])var1;
- }
-
- public ArrayDeque() {
- this.elements = (E[])(new Object[16]);
- }
-
- public ArrayDeque(int var1) {
- this.allocateElements(var1);
- }
-
- public ArrayDeque(Collection<? extends E> var1) {
- this.allocateElements(var1.size());
- this.addAll(var1);
- }
-
- public void addFirst(E var1) {
- if (var1 == null) {
- throw new NullPointerException();
- } else {
- this.elements[this.head = this.head - 1 & this.elements.length - 1] = var1;
- if (this.head == this.tail) {
- this.doubleCapacity();
- }
-
- }
- }
-
- public void addLast(E var1) {
- if (var1 == null) {
- throw new NullPointerException();
- } else {
- this.elements[this.tail] = var1;
- if ((this.tail = this.tail + 1 & this.elements.length - 1) == this.head) {
- this.doubleCapacity();
- }
-
- }
- }
-
- public boolean offerFirst(E var1) {
- this.addFirst(var1);
- return true;
- }
-
- public boolean offerLast(E var1) {
- this.addLast(var1);
- return true;
- }
-
- public E removeFirst() {
- Object var1 = this.pollFirst();
- if (var1 == null) {
- throw new NoSuchElementException();
- } else {
- return (E)var1;
- }
- }
-
- public E removeLast() {
- Object var1 = this.pollLast();
- if (var1 == null) {
- throw new NoSuchElementException();
- } else {
- return (E)var1;
- }
- }
-
- public E pollFirst() {
- int var1 = this.head;
- Object var2 = this.elements[var1];
- if (var2 == null) {
- return null;
- } else {
- this.elements[var1] = null;
- this.head = var1 + 1 & this.elements.length - 1;
- return (E)var2;
- }
- }
-
- public E pollLast() {
- int var1 = this.tail - 1 & this.elements.length - 1;
- Object var2 = this.elements[var1];
- if (var2 == null) {
- return null;
- } else {
- this.elements[var1] = null;
- this.tail = var1;
- return (E)var2;
- }
- }
-
- public E getFirst() {
- Object var1 = this.elements[this.head];
- if (var1 == null) {
- throw new NoSuchElementException();
- } else {
- return (E)var1;
- }
- }
-
- public E getLast() {
- Object var1 = this.elements[this.tail - 1 & this.elements.length - 1];
- if (var1 == null) {
- throw new NoSuchElementException();
- } else {
- return (E)var1;
- }
- }
-
- public E peekFirst() {
- return (E)this.elements[this.head];
- }
-
- public E peekLast() {
- return (E)this.elements[this.tail - 1 & this.elements.length - 1];
- }
-
- public boolean removeFirstOccurrence(Object var1) {
- if (var1 == null) {
- return false;
- } else {
- int var2 = this.elements.length - 1;
-
- Object var4;
- for(int var3 = this.head; (var4 = this.elements[var3]) != null; var3 = var3 + 1 & var2) {
- if (var1.equals(var4)) {
- this.delete(var3);
- return true;
- }
- }
-
- return false;
- }
- }
-
- public boolean removeLastOccurrence(Object var1) {
- if (var1 == null) {
- return false;
- } else {
- int var2 = this.elements.length - 1;
-
- Object var4;
- for(int var3 = this.tail - 1 & var2; (var4 = this.elements[var3]) != null; var3 = var3 - 1 & var2) {
- if (var1.equals(var4)) {
- this.delete(var3);
- return true;
- }
- }
-
- return false;
- }
- }
-
- public boolean add(E var1) {
- this.addLast(var1);
- return true;
- }
-
- public boolean offer(E var1) {
- return this.offerLast(var1);
- }
-
- public E remove() {
- return (E)this.removeFirst();
- }
-
- public E poll() {
- return (E)this.pollFirst();
- }
-
- public E element() {
- return (E)this.getFirst();
- }
-
- public E peek() {
- return (E)this.peekFirst();
- }
-
- public void push(E var1) {
- this.addFirst(var1);
- }
-
- public E pop() {
- return (E)this.removeFirst();
- }
-
- private void checkInvariants() {
- assert this.elements[this.tail] == null;
-
- if (!$assertionsDisabled) {
- if (this.head == this.tail) {
- if (this.elements[this.head] != null) {
- throw new AssertionError();
- }
- } else if (this.elements[this.head] == null || this.elements[this.tail - 1 & this.elements.length - 1] == null) {
- throw new AssertionError();
- }
- }
-
- assert this.elements[this.head - 1 & this.elements.length - 1] == null;
-
- }
-
- private boolean delete(int var1) {
- this.checkInvariants();
- Object[] var2 = this.elements;
- int var3 = var2.length - 1;
- int var4 = this.head;
- int var5 = this.tail;
- int var6 = var1 - var4 & var3;
- int var7 = var5 - var1 & var3;
- if (var6 >= (var5 - var4 & var3)) {
- throw new ConcurrentModificationException();
- } else if (var6 < var7) {
- if (var4 <= var1) {
- System.arraycopy(var2, var4, var2, var4 + 1, var6);
- } else {
- System.arraycopy(var2, 0, var2, 1, var1);
- var2[0] = var2[var3];
- System.arraycopy(var2, var4, var2, var4 + 1, var3 - var4);
- }
-
- var2[var4] = null;
- this.head = var4 + 1 & var3;
- return false;
- } else {
- if (var1 < var5) {
- System.arraycopy(var2, var1 + 1, var2, var1, var7);
- this.tail = var5 - 1;
- } else {
- System.arraycopy(var2, var1 + 1, var2, var1, var3 - var1);
- var2[var3] = var2[0];
- System.arraycopy(var2, 1, var2, 0, var5);
- this.tail = var5 - 1 & var3;
- }
-
- return true;
- }
- }
-
- public int size() {
- return this.tail - this.head & this.elements.length - 1;
- }
-
- public boolean isEmpty() {
- return this.head == this.tail;
- }
-
- public Iterator<E> iterator() {
- return new DeqIterator(this, (1)null);
- }
-
- public Iterator<E> descendingIterator() {
- return new DescendingIterator(this, (1)null);
- }
-
- public boolean contains(Object var1) {
- if (var1 == null) {
- return false;
- } else {
- int var2 = this.elements.length - 1;
-
- Object var4;
- for(int var3 = this.head; (var4 = this.elements[var3]) != null; var3 = var3 + 1 & var2) {
- if (var1.equals(var4)) {
- return true;
- }
- }
-
- return false;
- }
- }
-
- public boolean remove(Object var1) {
- return this.removeFirstOccurrence(var1);
- }
-
- public void clear() {
- int var1 = this.head;
- int var2 = this.tail;
- if (var1 != var2) {
- this.head = this.tail = 0;
- int var3 = var1;
- int var4 = this.elements.length - 1;
-
- do {
- this.elements[var3] = null;
- var3 = var3 + 1 & var4;
- } while(var3 != var2);
- }
-
- }
-
- public Object[] toArray() {
- return this.copyElements(new Object[this.size()]);
- }
-
- public <T> T[] toArray(T[] var1) {
- int var2 = this.size();
- if (var1.length < var2) {
- var1 = Array.newInstance(var1.getClass().getComponentType(), var2);
- }
-
- this.copyElements(var1);
- if (var1.length > var2) {
- var1[var2] = null;
- }
-
- return (T[])var1;
- }
-
- public ArrayDeque<E> clone() {
- try {
- ArrayDeque var1 = (ArrayDeque)super.clone();
- var1.elements = (E[])Arrays.copyOf(this.elements, this.elements.length);
- return var1;
- } catch (CloneNotSupportedException var2) {
- throw new AssertionError();
- }
- }
-
- private void writeObject(ObjectOutputStream var1) throws IOException {
- var1.defaultWriteObject();
- var1.writeInt(this.size());
- int var2 = this.elements.length - 1;
-
- for(int var3 = this.head; var3 != this.tail; var3 = var3 + 1 & var2) {
- var1.writeObject(this.elements[var3]);
- }
-
- }
-
- private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
- var1.defaultReadObject();
- int var2 = var1.readInt();
- this.allocateElements(var2);
- this.head = 0;
- this.tail = var2;
-
- for(int var3 = 0; var3 < var2; ++var3) {
- this.elements[var3] = var1.readObject();
- }
-
- }
-
- // $FF: synthetic method
- static int access$200(ArrayDeque var0) {
- return var0.head;
- }
-
- // $FF: synthetic method
- static int access$300(ArrayDeque var0) {
- return var0.tail;
- }
-
- // $FF: synthetic method
- static Object[] access$400(ArrayDeque var0) {
- return var0.elements;
- }
-
- // $FF: synthetic method
- static boolean access$500(ArrayDeque var0, int var1) {
- return var0.delete(var1);
- }
- }
-